package br.com.saeng2D.objeto;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Stroke;
import java.io.PrintWriter;

import br.com.saeng2D.util.R2D;
import br.com.saeng2D.util.Util;

//Um tipo abstrato que permite muitas implementações
public abstract class AbstratoObjeto {
	public static final Stroke LARGURA_LINHA = new BasicStroke(Util.getInt("largura_linha"));
	public static final Stroke LARGURA_LINHA_ABSTRATO_OBJETO = new BasicStroke(Util.getInt("largura_linha_abstrato_objeto"));
	public static final Stroke LARGURA_LINHA_MEDIDA_PARALELA = new BasicStroke(Util.getInt("largura_linha_medida_paralela"));
	//Atributos
	protected Color corSelecionado;
	protected boolean selecionado;
	protected boolean habilitado;
	protected AbstratoObjeto pai;
	protected String descricao;
	protected Color corPlotado;
	protected boolean plotado;
	protected boolean visivel;
	protected Color corFundo;
	protected Color corFonte;
	//dimensões
	protected int largura;
	protected int altura;
	//coordenadas
	protected int x;
	protected int y;
	
	//Construtor
	public AbstratoObjeto(AbstratoObjeto pai, String descricao, int x, int y, int largura, int altura) {
		this.corSelecionado = Util.getCor("cor_selecionado_abstrato_objeto");
		this.corFundo = Util.getCor("cor_fundo_abstrato_objeto");
		this.corFonte = Util.getCor("cor_fonte_abstrato_objeto");
		this.descricao = descricao;
		this.selecionado = false;
		this.habilitado = true;
		this.largura = largura;
		this.altura = altura;
		this.visivel = true;
		this.pai = pai;
		this.x = x;
		this.y = y;
	}
	
	public final String getDescricaoDetalhada() {
		return null;
	}
	
	//As implementacoes usarao algum criterio pra decidir a igualdade
	public abstract boolean ehIgual(AbstratoObjeto objeto);
	
	//Alterar o tamanho do objeto
	public abstract void alterarTamanho(int tamanho);
	
	//Usar a classe Graphics2D para gerar os pixels
	public abstract void desenhar(Graphics2D g2);
	
	//Salvar os atributos em xml 
	public abstract void salvarXML(String prefixo, PrintWriter pw);

	//Retornar verdadeiro se a coordenada x e y o seleciona 
	public abstract boolean estarSob(int x, int y);

	//Retornar a área ocupada na superfície
	public abstract R2D getArea();

	//Retornar um cópia do objeto
	public abstract AbstratoObjeto prototipo();

	public String toString() {
		return descricao + "[x=" + x + ", y=" + y + "]";
	}

	public Color getCorSelecionado() {
		return corSelecionado;
	}

	public void setCorSelecionado(Color corSelecionado) {
		this.corSelecionado = corSelecionado;
	}

	public boolean isSelecionado() {
		return selecionado;
	}

	public void setSelecionado(boolean selecionado) {
		this.selecionado = selecionado;
	}

	public boolean isHabilitado() {
		return habilitado;
	}

	public void setHabilitado(boolean habilitado) {
		this.habilitado = habilitado;
	}

	public AbstratoObjeto getPai() {
		return pai;
	}

	public String getDescricao() {
		return descricao;
	}

	public void setDescricao(String descricao) {
		this.descricao = descricao;
	}

	public boolean isVisivel() {
		return visivel;
	}

	public void setVisivel(boolean visivel) {
		this.visivel = visivel;
	}

	public Color getCorFundo() {
		return corFundo;
	}

	public void setCorFundo(Color corFundo) {
		this.corFundo = corFundo;
	}

	public Color getCorFonte() {
		return corFonte;
	}

	public void setCorFonte(Color corFonte) {
		this.corFonte = corFonte;
	}

	public int getLargura() {
		return largura;
	}

	public void setLargura(int largura) {
		this.largura = largura;
	}

	public int getAltura() {
		return altura;
	}

	public void setAltura(int altura) {
		this.altura = altura;
	}

	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	public boolean isPlotado() {
		return plotado;
	}

	public void setPlotado(boolean plotado) {
		this.plotado = plotado;
	}
	
	public void antesExclusao() {
		
	}

	public Color getCorPlotado() {
		return corPlotado;
	}

	public void setCorPlotado(Color corPlotado) {
		this.corPlotado = corPlotado;
	}
}